/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { ts } from 'qvog-dsl';
import { rule } from 'qvog-dsl';

const SEVERITY = 2;
const DOC_PATH = 'docs/no-case-declarations-check.md';
const DESCRIPTION = 'Disallow lexical declarations in case clauses.';

export default rule<{ invalidPositions: ts.Node[] }>()
    .match((node): node is ts.CaseClause | ts.DefaultClause => {
        return ts.isCaseClause(node) || ts.isDefaultClause(node);
    })
    .when((node: ts.CaseClause | ts.DefaultClause): ts.Node[] => {
        let invalidPositions: ts.Node[] = [];
        node.statements.forEach((statement) => {
            if (ts.isVariableStatement(statement)) {
                const declarationList = statement.declarationList;
                if (declarationList.flags & ts.NodeFlags.Let || declarationList.flags & ts.NodeFlags.Const) {
                    invalidPositions.push(statement);
                }
            } else if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) {
                invalidPositions.push(statement);
            }
        });
        return invalidPositions;
    })
    .report({
        severity: SEVERITY,
        description: DESCRIPTION,
        docPath: DOC_PATH,
    });
